package apibasej.db.transaction;

import java.io.Closeable;

import apibasej.basic.config.ConfigManager;
import apibasej.db.to.StatementQuery;
import apibasej.db.to.StatementValues;

public abstract class GenericTransaction extends ConfigManager implements Closeable{

	//não adianta ignorar o close(), pois o postgre já invalida a transação depois de retornar um erro
	//private boolean ignoreCloseAfterError = false;

	protected abstract int executeUpdate(StatementValues sv) throws Exception; // INSERT, UPDATE ou DELETE
	
	public abstract CursorSelect executeQuery(StatementQuery sv) throws UtilDBException; // SELECT
	
	// para verificar se deve fechar a conexão após a execução de algum comando
	public abstract void verifyCloseAfterExecute(); //boolean isError
	
	// já tem na interface Closeable, mas define denovo para não poder lançar exceção
	public abstract void close();
	
	protected abstract boolean isAutomaticClose();
	
	// para caso queira fazer alguma validação, deve ser chamado antes do close() (liberação para o pool), para conseguir verificar validade da conexão
	public abstract void verifyConnectionAfterError();
	

	
	/*
	public boolean isIgnoreCloseAfterError() {
		return ignoreCloseAfterError;
	}
	public void setIgnoreCloseAfterError(boolean ignoreCloseAfterError) {
		this.ignoreCloseAfterError = ignoreCloseAfterError;
	}
	public static void err(String m, Throwable e, ConfigManager c, StatementValues statementQuery, StatementValues statementUpdate) throws UtilDBException{
		String lastSqls = null;
		try{
			lastSqls = "\n"+(statementQuery!=null?statementQuery.getSqlInfo():null)+"\n"+(statementUpdate!=null?statementUpdate.getSqlInfo():"");
			//if(lastSqls!=null && lastSqls.trim().length()>0){
			//	c.getProp(CommonProperties.LOGGER).log(Level.SEVERE,"LAST SQLS: "+lastSqls);
			//}
		}catch (Exception e2) {
			c.getProp(CommonProperties.LOGGER).log(Level.SEVERE,"Error on generate log info",e2);
		}
		if(e==null){
			c.getProp(CommonProperties.LOGGER).log(Level.SEVERE,m+"; LAST SQLS:\n "+lastSqls);
			throw new UtilDBException(m);
		}else{
			c.getProp(CommonProperties.LOGGER).log(Level.SEVERE,m+"; LAST SQLS:\n "+lastSqls,e);
			if(e instanceof UtilDBException) throw (UtilDBException)e;
			else throw new UtilDBException(m,e);
		}
	}*/
}
